from django.shortcuts import render
from django.views.generic import View
from django.http import HttpResponse
from django.db.models import Q

from pure_pagination import Paginator,EmptyPage,PageNotAnInteger

from .models import Course,CourseResource,Video
from operation.models import UserFavorite,CourseComments,UserCourse
from utils.mixin_utils import LoginRequiredMixin

# Create your views here.


class CourseListView(View):
    def get(self,request):
        all_courses=Course.objects.all().order_by("-add_time")

        #热门推荐
        hot_courses=Course.objects.all().order_by("-click_num")[:3]

        #课程搜索
        search_keywords=request.GET.get("keywords","")
        if search_keywords:
            all_courses=all_courses.filter(Q(name__icontains=search_keywords)|Q(desc__contains=search_keywords)|Q(detail__contains=search_keywords))

        # 学习人数和课程数排序
        sort = request.GET.get('sort', "")
        if sort:
            if sort == "students":
                all_courses = all_courses.order_by("-students")
            else:
                all_courses = all_courses.order_by("-click_num")

        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        p = Paginator(all_courses, 3, request=request)
        # 这里的数字3是每页显示的记录条数，官方例子没加这个参数，但是不加会报错。
        courses = p.page(page)
        return render(request,'course-list.html',{
            "all_courses":courses,
            "sort":sort,
            "hot_courses":hot_courses
        })


class CourseDetailView(View):
    def get(self,request,course_id):
        course=Course.objects.get(id=int(course_id))
        course.click_num+=1
        course.save()

        # 课程详情页收藏
        has_fav_course = False
        has_fav_org = False
        if request.user.is_authenticated:
            if UserFavorite.objects.filter(user=request.user, fav_id=course.id, fav_type=1):
                has_fav_course = True
            if UserFavorite.objects.filter(user=request.user, fav_id=course.course_org.id, fav_type=2):
                has_fav_org = True


        #相关推荐
        tag=course.tag
        if tag:
            relate_courses=Course.objects.filter(tag=tag)[:2]
        else:
            relate_courses=[]
        return render(request,'course-detail.html',{
            "course":course,
            "relate_courses":relate_courses,
            "has_fav_course": has_fav_course,
            "has_fav_org": has_fav_org,
        })


class CourseInfoView(LoginRequiredMixin,View):
    def get(self,request,course_id):
        course=Course.objects.get(id=int(course_id))
        course.students+=1
        course.save()
        # 查询用户是否已经关联该课程
        user_courses = UserCourse.objects.filter(user=request.user, course=course)
        if not user_courses:
            user_course = UserCourse(user=request.user, course=course)
            user_course.save()
            course.students += 1
            course.save()

        # 相关课程推荐
        user_courses = UserCourse.objects.filter(course=course)
        user_ids = [user_course.user.id for user_course in user_courses]
        # 获取用户的所有课程
        all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
        # 取出所有课程id
        course_ids = [user_course.course.id for user_course in all_user_courses]
        # 获取学过该课程的用户课程
        relate_courses = Course.objects.filter(id__in=course_ids).order_by("-click_num")[:3]
        all_course_resources=CourseResource.objects.filter(course=course)
        return render(request,'course-video.html',{
            "course":course,
            "course_resources":all_course_resources,
            "relate_courses":relate_courses
        })


class CommentsView(LoginRequiredMixin,View):
    def get(self,request,course_id):
        course=Course.objects.get(id=int(course_id))
        all_course_resources=CourseResource.objects.filter(course=course)
        all_comments=CourseComments.objects.all()
        return render(request,'course-comment.html',{
            "course":course,
            "course_resources":all_course_resources,
            "all_comments":all_comments
        })


class AddCommentView(View):
    def post(self,request):
        if not request.user.is_authenticated:
            # 判断用户登录状态
            return HttpResponse('{"status":"fail", "msg":"用户未登录"}', content_type='application/json')
        course_id=request.POST.get("course_id",0)
        comments=request.POST.get("comments","")
        if int(course_id) >0 :
            if comments:
                course_comments=CourseComments()
                course=Course.objects.get(id=int(course_id))
                course_comments.course=course
                course_comments.comments=comments
                course_comments.user=request.user
                course_comments.save()
                return HttpResponse('{"status":"success", "msg":"添加成功"}', content_type='application/json')
            return HttpResponse('{"status":"fail", "msg":"添加失败"}', content_type='application/json')
        else:
            return HttpResponse('{"status":"fail", "msg":"添加失败"}', content_type='application/json')


class VideoPlayView(View):
    def get(self, request, video_id):
        video = Video.objects.get(id=int(video_id))
        course=video.lesson.course
        course.students+=1
        course.save()

        # 查询用户是否已经关联该课程
        user_courses = UserCourse.objects.filter(user=request.user, course=course)
        if not user_courses:
            user_course = UserCourse(user=request.user, course=course)
            user_course.save()
            course.students += 1
            course.save()

        # 相关课程推荐
        user_courses = UserCourse.objects.filter(course=course)
        user_ids = [user_course.user.id for user_course in user_courses]
        # 获取用户的所有课程
        all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
        # 取出所有课程id
        course_ids = [user_course.course.id for user_course in all_user_courses]
        # 获取学过该课程的用户课程
        relate_courses = Course.objects.filter(id__in=course_ids).order_by("-click_num")[:3]
        all_course_resources = CourseResource.objects.filter(course=course)
        return render(request, 'course-play.html', {
            "course": course,
            "course_resources": all_course_resources,
            "relate_courses": relate_courses,
            "video":video
        })